In-class Exercise 6

A new article created using the Distill format.

Nora Jones https://example.com/norajones (Spacely Sprockets)https://example.com/spacelysprokets
2022-05-21

Getting Started

Install R Packages

packages = c('tidyverse','sf','tmap','lubridate','clock','sftime','rmarkdown')

for(p in packages){
  if(!require(p, character.only = T)){
    install.packages(p)
  }
  library(p, character.only = T)
}

Importing the data

schools <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/Schools.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")
buildings<- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/Buildings.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")
apartments <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/Apartments.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")
pubs <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/Pubs.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")
employers <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/employers.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")
restaurants <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/Restaurants.csv", 
                   options = "GEOM_POSSIBLE_NAMES=location")

view the deometry type

print(schools)
Simple feature collection with 4 features and 4 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -4701.463 ymin: 1607.984 xmax: -376.7505 ymax: 6556.032
CRS:           NA
# A tibble: 4 × 5
  schoolId monthlyCost maxEnrollment             location
  <chr>    <chr>       <chr>                      <POINT>
1 0        12.81244502 242           (-376.7505 1607.984)
2 450      91.14351385 418           (-2597.448 3194.155)
3 900      38.00537955 394           (-2539.158 6556.032)
4 1350     73.19785215 384           (-4701.463 5141.763)
# … with 1 more variable: buildingId <chr>

tmap plot

tmap_mode("plot")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1)
tmap_mode("plot")

Interactive tmap view

tmap_mode("view")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1)
tmap_mode("plot")

Composite map with tmap

tmap_mode("plot")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1) +
tm_shape(employers) +
  tm_dots(col = "red")

tmap_mode("plot")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1) +
tm_shape(employers) +
  tm_dots(col = "red") +
tm_shape(schools) +
  tm_dots(col = "yellow") +
tm_shape(pubs) +
  tm_dots(col = "blue") +
tm_shape(restaurants) +
  tm_dots(col = "green") +
tm_shape(apartments) +
  tm_dots(col = "lightblue")

Movement Data

Import the big data and save the subset data to rds format

logs <- read_sf("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/wkt/ParticipantStatusLogs1.csv", 
                options = "GEOM_POSSIBLE_NAMES=currentLocation")
glimpse(logs)
logs_selected <- logs %>%
  mutate(Timestamp = date_time_parse(timestamp,
                                      zone="",
                                      format="%Y-%m-%dT%H:%M:%S"))%>%
  mutate(day=get_day(Timestamp)) %>%
  filter(currentMode == 'Transport')
write_rds(logs_selected,"/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/rds/logs_selected.rds")

Importing the data

logs_selected <- read_rds("/Users/junqiuni/Downloads/visual/pilipalabong/ISSS608/in_class_ex/data/rds/logs_selected.rds")
tmap_mode("plot")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1) +
tm_shape(logs_selected) +
  tm_dots(col = "red")

hex <- st_make_grid(buildings, 
                    cellsize=100, 
                    square=FALSE) %>%
  st_sf() %>%
  rowid_to_column('hex_id')
plot(hex)

points_in_hex <- st_join(logs_selected, 
                         hex, 
                         join=st_within)
#plot(points_in_hex, pch='.')
points_in_hex <- st_join(logs_selected, 
                        hex, 
                        join=st_within) %>%
  st_set_geometry(NULL) %>%
  count(name='pointCount', hex_id)
head(points_in_hex)
# A tibble: 6 × 2
  hex_id pointCount
   <int>      <int>
1    169         35
2    212         56
3    225         21
4    226         94
5    227         22
6    228         45
hex_combined <- hex %>%
  left_join(points_in_hex, 
            by = 'hex_id') %>%
  replace(is.na(.), 0)
tm_shape(hex_combined %>%
           filter(pointCount > 0))+
  tm_fill("pointCount",
          n = 8,
          style = "quantile") +
  tm_borders(alpha = 0.1)

Movement Path

logs_path <- logs_selected %>%
  group_by(participantId, day) %>%
  summarize(m = mean(Timestamp), 
            do_union=FALSE) %>%
  st_cast("LINESTRING")
print(logs_path)
Simple feature collection with 5781 features and 3 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -4616.828 ymin: 35.4377 xmax: 2630 ymax: 7836.546
CRS:           NA
# A tibble: 5,781 × 4
# Groups:   participantId [1,011]
   participantId   day m                               currentLocation
   <chr>         <int> <dttm>                             <LINESTRING>
 1 0                 1 2022-03-01 13:34:23 (-2721.353 6862.861, -2689…
 2 0                 2 2022-03-02 14:19:50 (-2721.353 6862.861, -2689…
 3 0                 3 2022-03-03 13:39:13 (-2721.353 6862.861, -2689…
 4 0                 4 2022-03-04 13:38:11 (-2721.353 6862.861, -2689…
 5 0                 5 2022-03-05 13:08:02 (-2721.353 6862.861, -2689…
 6 0                 6 2022-03-06 06:28:00 (-2721.353 6862.861, -2689…
 7 1                 1 2022-03-01 18:07:24 (-1531.133 5597.244, -1863…
 8 1                 2 2022-03-02 16:57:05 (-2619.036 5860.49, -2200.…
 9 1                 3 2022-03-03 14:13:40 (-260.4575 5026.151, -352.…
10 1                 4 2022-03-04 14:31:45 (-3903.194 5967.837, -3655…
# … with 5,771 more rows
logs_path0=filter(logs_path,participantId == 0)
tmap_mode("plot")
tm_shape(buildings)+
tm_polygons(col = "grey60",
           size = 1,
           border.col = "black",
           border.lwd = 1) +
tm_shape(logs_path0) +
  tm_lines(col = "blue")